/*****************************************************************************
*名称:	日志包
*功能:	日志的打印,写入文件
*作者:	钱纯净
******************************************************************************/

package logs

import (
	"fmt"
	"gitee.com/injoyai/goutil/string/color"
	"time"
)

var (
	DefaultInfo   = NewEntity("_info").SetName("信息").SetLevel(1).SetColor(color.Cyan)
	DefaultWarn   = NewEntity("_warn").SetName("警告").SetLevel(1).SetColor(color.Violet)
	DefaultErr    = NewEntity("_err").SetName("错误").SetLevel(1).SetColor(color.Red).ToFile()
	DefaultDebug  = NewEntity("_debug").SetName("调试").SetLevel(1).SetColor(color.Yellow)
	DefaultTest   = NewEntity("_test").SetName("测试").SetLevel(1).SetColor(color.Blue)
	defaultMap    = newMap(time.Hour*12).Add(DefaultInfo, DefaultWarn, DefaultErr, DefaultDebug, DefaultTest)
	defaultPath   = "./output/logs"
	defaultLayout = "/2006-01-02/{name}_15.log"
)

// New 新建,传入前缀
func New(key ...string) *Entity {
	x := ""
	if len(key) > 0 {
		x = key[0]
	}
	return defaultMap.Get(x)
}

// SaveDay 日志保存天数
func SaveDay(day int) *Map {
	defaultMap.saveDay = day
	return defaultMap
}

// AddMiddle 添加中间件
func AddMiddle(fn ...func(e *Entity, msg string)) *Map {
	for _, v := range defaultMap.m {
		v.AddMiddle(fn...)
	}
	return defaultMap
}

// SetUse 使用中间件
func SetUse(fn ...func(e *Entity, msg string)) *Map {
	for _, v := range defaultMap.m {
		v.SetUse(fn...)
	}
	return defaultMap
}

// Level 日志位置层级
func Level(n int) *Map {
	for _, v := range defaultMap.m {
		switch v.key {
		case "_info", "_warn", "_err", "_debug", "_test":
			v.SetLevel(n + 1)
		default:
			v.SetLevel(n)
		}
	}
	return defaultMap
}

// ToFilePath 日志输出文件路径
func ToFilePath(s string) *Map {
	defaultPath = s
	for _, v := range defaultMap.m {
		v.ToFilePath(s)
	}
	return defaultMap
}

// ToFile 写出到文件
func ToFile(b ...bool) *Map {
	for _, v := range defaultMap.m {
		v.ToFile(b...)
	}
	return defaultMap
}

// ToFileLayout 写出到文件的格式
func ToFileLayout(layout string) *Map {
	for _, v := range defaultMap.m {
		v.ToFileLayout(layout)
	}
	return defaultMap
}

// ShowColor 显示颜色
func ShowColor(b ...bool) *Map {
	for _, v := range defaultMap.m {
		v.ShowColor(b...)
	}
	return defaultMap
}

//=================================

// PrintErr 打印错误,有错误才打印
func PrintErr(err error) bool {
	if err != nil {
		DefaultErr.Print(err.Error())
	}
	return err != nil
}

// Test 预设测试 蓝色
//[测试] 2022/01/08 10:44:02 init_test.go:10:
func Test(s ...interface{}) {
	DefaultTest.Print(s...)
}

// Testf 预设测试 蓝色
//[测试] 2022/01/08 10:44:02 init_test.go:10:
func Testf(format string, s ...interface{}) {
	DefaultTest.Print(fmt.Sprintf(format, s...))
}

// Warn 预设警告
//[警告] 2022/01/08 10:44:02 init_test.go:10:
func Warn(s ...interface{}) {
	DefaultWarn.Print(s...)
}

// Warnf 警告
func Warnf(format string, s ...interface{}) {
	DefaultWarn.Print(fmt.Sprintf(format, s...))
}

// Err 预设错误 红色 写入文件
//[错误] 2022/01/08 10:44:02 init_test.go:10:
func Err(s ...interface{}) {
	DefaultErr.Print(s...)
}

// Error 预设错误 红色 写入文件
//[错误] 2022/01/08 10:44:02 init_test.go:10:
func Error(s ...interface{}) {
	DefaultErr.Print(s...)
}

// Errorf 预设错误 红色 写入文件
//[错误] 2022/01/08 10:44:02 init_test.go:10:
func Errorf(format string, s ...interface{}) {
	DefaultErr.Print(fmt.Sprintf(format, s...))
}

// Errf 预设错误 红色 写入文件
//[错误] 2022/01/08 10:44:02 init_test.go:10:
func Errf(format string, s ...interface{}) {
	DefaultErr.Print(fmt.Sprintf(format, s...))
}

// Info 预设信息 青色
//[信息] 2022/01/08 10:44:02 init_test.go:10:
func Info(s ...interface{}) {
	DefaultInfo.Print(s...)
}

// Infof 预设信息 青色
//[信息] 2022/01/08 10:44:02 init_test.go:10:
func Infof(format string, s ...interface{}) {
	DefaultInfo.Print(fmt.Sprintf(format, s...))
}

// Debug 预设调试 黄色
//[调试] 2022/01/08 10:44:02 init_test.go:10:
func Debug(s ...interface{}) {
	DefaultDebug.Print(s...)
}

// Debugf 预设调试 黄色
// [调试] 2022/01/08 10:44:02 init_test.go:10:
func Debugf(format string, s ...interface{}) {
	DefaultDebug.Print(fmt.Sprintf(format, s...))
}

func SDebug(s ...interface{}) string {
	return DefaultDebug.Sprint(s...)
}
